package Day019_Junit单元测试_NIO.demo4_Channel接口_通道;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author zhangyan
 * @date 2020/5/12 11:51
 */
 /*
            java.nio.channels.FileChannel (抽象类)：用于读、写文件的通道
            获取FileChannel对象:
                        FileInputStream 的 getChannel()方法
                        FileOutputStream 的 getChannel()方法
*/

public class Test2_FileChannel类 {
    public static void main(String[] args) throws Exception{

        //回顾: IO流复制文件
        /*

         */

        //NIO FileChannel复制文件
        //创建流对象
        FileInputStream fis = new FileInputStream("Demo02\\aaa\\e.txt");
        FileOutputStream fos = new FileOutputStream("Demo02\\aaa\\eCopy.txt");

        //获取FileChannel对象
        FileChannel fc1 = fis.getChannel();
        FileChannel fc2 = fos.getChannel();

        //创建ByteBuffer缓冲数组
        ByteBuffer bb = ByteBuffer.allocate(1000);

        int len;
        //循环读写数据
        while ((len = fc1.read(bb)) != -1){
            //***flip***
            bb.flip(); //flip切换到读  position变成0  limit变成position位置81  读取范围是[0-81) ==>81字节
            fc2.write(bb); //默认会把position--limit之间数据写出
            //1000大于文件字节数,会重复接收数据
            //需要clear
            bb.clear();
        }

        //关闭资源
        fc2.close();
        fc1.close();
        fos.close();
        fis.close();
    }
/*
    开始: 容量:1000  limit限制:1000  position位置:0  [0-1000)

    读取e.txt的81个(0-80)字节数据后,position从0变成81  写出范围是[81-1000) ==> 919字节  所以eCopy.txt 是919字节

    解决:flip切换到读  position变成0  limit变成position位置81  读取范围是[0-81) ==>81字节

    结论:
         读写操作是 操作position--limit之间的数据
         写完去读,调用flip方法
         读完去写,调用clear方法
         如果不调用flip方法,就去读取缓冲数组的数据,那么读取到的是3-6之间的索引元素
         如果调用flip方法后,读取缓冲数组的数据,那么读取到的是0-3之间的索引元素

 */


    //获取FileChannel对象
    private static void method() throws FileNotFoundException {
        //创建流对象
        FileInputStream fis = new FileInputStream("Demo02\\aaa\\e.txt");
        FileOutputStream fos = new FileOutputStream("Demo02\\aaa\\eCopy.txt");

        //获取FileChannel对象
        FileChannel fc1 = fis.getChannel();
        FileChannel fc2 = fos.getChannel();
    }
}
